home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 363 / tprolog1 / germndoc.arc / DOCUMENT.DOC (.txt)
ST Writer Document  |  1990-02-03  |  74KB  |  1,991 lines

  1. Do Run Run STWRITER.PRG
  2.                TOY Prolog ST
  3.           Dokumentation f
  4. r Version 3
  5.      Inhalt
  6. I.   Urheberrechte
  7. II.  Syntax und Benutzerschnittstelle
  8. III. Systemfunktionen und vordefinierte Pr
  9. dikate
  10. IV.  Die Hilfsprogramme
  11. V.   Die Demonstrationsprogramme
  12.      Anhang
  13. A.1  Aufbau des Interpreters
  14. A.2  Syntax des inneren Interpreters
  15. A.3  Die Systemdatei
  16. A.4  Die Implementierung der Benutzerschnittstelle
  17. A.5  Unterschiede der vorliegenden Version zur Dokumentation
  18.      I. Urheberrechte
  19. Das Programm basiert auf einer Implementierung von Prolog, die von 
  20. Feliks Kluzniak und Stanislaw Szpakowicz in ihrem Buch "Prolog for 
  21. Programmers" (Academic Press, London, 1985) ver
  22. ffentlicht wurde.
  23. Die Rechte f
  24. r die ATARI-Version liegen bei Jens Kilian, Bensheim.
  25. Das Programm ist unter der Bedingung,  da
  26.  keiner der Hinweise auf 
  27. die  bestehenden  Urheberrechte  aus  den  verschiedenen   Dateien 
  28. entfernt   oder  ver
  29. ndert  wird,   freigegeben  zur  
  30. ffentlichen 
  31. Verbreitung, jedoch darf es nicht gewinnbringend verkauft werden.
  32. ATARI,   520  ST  und  TOS  sind  Warenzeichen der ATARI Corp.
  33. GEM ist Warenzeichen von Digital Research, Inc.
  34.      II. Syntax und Benutzerschnittstelle
  35. Der verwendete Dialekt 
  36. hnelt stark dem in "Programming in Prolog" 
  37. (Clocksin/Mellish,  Springer-Verlag,  Berlin  und Heidelberg 1981) 
  38. verwendeten  Dialekt  Prolog-10.  Einige der  Unterschiede  werden 
  39. weiter unten mit angegeben.
  40.      II.1 Syntax von TOY Prolog
  41. Die  verwendete  Notation  ist  BNF,  wobei  die  nicht-terminalen 
  42. Symbole  fett  dargestellt  sind;  einige davon sind  mit  Indizes 
  43. versehen.  Der Konstrukt  {  s  }  bedeutet, da
  44.  die Symbolfolge s 
  45. beliebig oft (auch 0 mal) wiederholt werden kann.
  46. Um Verwechselungen vorzubeugen,  sind die terminalen Symbole {, |, 
  47. } ebenfalls fett dargestellt.
  48. Es  wird  angenommen,  da
  49.  die normalen Operatorvereinbarungen  in 
  50. Kraft sind.
  51. Kommentare sind durch *** angegeben.
  52. Klausel             ::= Definition | Grammatische_Regel | Direktive
  53. Definition          ::= Regel | Fakt
  54. Regel               ::= Kopf :- Rumpf
  55. Fakt                ::= Kopf
  56. *** Der 
  57. erste Funktor von Kopf ist nicht :- / 2
  58. Kopf                ::= Funktor_Term
  59. Rumpf               ::= Rumpf_Alternative { ; Rumpf_Alternative }
  60. Rumpf_Alternative   ::= Aufruf { , Aufruf }
  61. Aufruf              ::= Funktor_Term | Variable | ( Rumpf )
  62. Funktor_Term        ::= Term
  63. *** Keine Variable und kein Integer; eine formale Definition 
  64. *** w
  65. re ziemlich aufwendig
  66. Grammatische_Regel  ::= Linke_Seite --> Rechte_Seite
  67. Linke_Seite         ::= Nicht_terminal Kontext | Nicht_terminal
  68. Nicht_terminal      ::= Funktor_Term
  69. Kontext             ::= terminale_Symbole
  70. Rechte_Seite        ::= Alternativen
  71. Alternativen        ::= Alternative { ; Alternative }
  72. Alternative         ::= Regel_Element { , Regel_Element }
  73. Regel_Element       ::= Nicht_terminal | terminale_Symbole |
  74.                         Bedingung | ! | ( Alternativen )
  75. terminale_Symbole   ::= Liste | Zeichenkette
  76. *** Nur 'geschlossene' Listen sind erlaubt
  77. Bedingung           ::= Klammer_Term
  78. Direktive           ::= Kommando | Anfrage
  79. Kommando            ::= :- Rumpf
  80. Anfrage             ::= Rumpf
  81. *** Der 
  82. erste Funktor von Rumpf ist nicht :- / 1
  83. Term                ::= Term1200
  84. TermN               ::= Opfx,N TermN-1 | Opfy,N TermN |
  85.                         TermN-1 Opxf,N | TermN Opyf,N |
  86.                         TermN-1 Opxfx,N TermN-1 |
  87.                         TermN-1 Opxfy,N TermN   |
  88.                         TermN   Opyfx,N TermN-1 |
  89.                         TermN   Opyfy,N TermN   | TermN-1
  90. *** 1 
  91.  1200; OpTyp,N ist ein Operator mit Typ 'Typ' und
  92. *** Priorit
  93. t N; TermN kann man 'Term mit Priorit
  94. t N' nennen.
  95. Term0               ::= Variable | Integer | Zeichenkette |
  96.                         Liste | Nicht_Operator | 
  97.                         Nicht_Operator ( Term { , Term } ) |
  98.                         ( Term ) | Klammer_Term
  99. Klammer_Term        ::= { Term }
  100. Nicht_Operator      ::= Funktor
  101. OpT,N               ::= Funktor
  102. *** T 
  103.  { fx, fy, xf, yf, xfx, xfy, yfx, yfy }, 1 
  104.  1200
  105. *** siehe auch Bemerkung 1
  106. Liste               ::= [] | [ Term999 { , Term999 } ] |
  107.                         [ Term999 { , Term999 } | Term ]
  108. *** Terme mit Priorit
  109. t 999 k
  110. nnen ohne Klammern mit Kommas
  111. *** verbunden werden ( , / 2 hat Priorit
  112. t 1000)
  113. Funktor             ::= Wort | Q_Name | Symbol | Einzelzeichen
  114. Wort                ::= Wortanfang { Alphanum }
  115. Wortanfang          ::= Kleinbuchstabe
  116. Alphanum            ::= Kleinbuchstabe | Gro
  117. buchstabe | 
  118.                         Ziffer | _
  119. Q_Name              ::= ' { Q_Zeichen } '
  120. Q_Zeichen           ::= '' | Nicht_'
  121. *** Nicht_' ist ein beliebiges Zeichen au
  122. Symbol              ::= Symbolzeichen { Symbolzeichen }
  123. Variable            ::= Variablenanfang { Alphanum }
  124. Variablenanfang     ::= Gro
  125. buchstabe | _
  126. Integer             ::= - Ziffer { Ziffer } | Ziffer { Ziffer }
  127. Zeichenkette        ::= " { S_Zeichen } "
  128. *** In TOY bedeutet eine Zeichenkette eine Liste aus den Namen
  129. *** der Zeichen, in Prolog-10 eine Liste ihrer ASCII-Codes
  130. S_Zeichen           ::= "" | Nicht_"
  131. *** Nicht_" ist ein beliebiges Zeichen au
  132. Kleinbuchstabe      ::= a | b | c | d | e | f | g | h | i |
  133.                         j | k | l | m | n | o | p | q | r |
  134.                         s | t | u | v | w | x | y | z | 
  135.                         
  136.                         
  137.                         
  138.                         
  139. buchstabe       ::= A | B | C | D | E | F | G | H | I |
  140.                         J | K | L | M | N | O | P | Q | R |
  141.                         S | T | U | V | W | X | Y | Z | 
  142.                         
  143.                         
  144. Ziffer              ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  145. Symbolzeichen       ::= # | $ | & | * | + | - | . | / | : |
  146.                         < | = | > | ? | @ | \ | ^ | ` | ~ |
  147.                         
  148.                         
  149.                         
  150. *** Ein einzelner Punkt, gefolgt von Leerraum,
  151. *** ist kein Symbolzeichen, sondern ein Ende_Punkt.
  152. Einzelzeichen       ::= , | ; | !
  153. Zeichengruppe       ::= Funktor | Variable | Integer |
  154.                         Zeichenkette | Klammer_oder_Strich
  155. *** Zeichengruppen werden in Bemerkung 6 verwendet, s.u.
  156. Klammer_oder_Strich ::= ( | ) | [ | ] | { | } | |
  157. Kommentar           ::= % { Nicht_Zeilenende } Zeilenende
  158. *** Zeilenende ist ein Zeichen, das das Ende einer Zeile angibt,
  159. *** Nicht_Zeilenende ist ein beliebiges anderes Zeichen.
  160. *** TOY Prolog wandelt alle Zeilenenden in einzelne CR-Zeichen um.
  161. Leerraum            ::= { Kontrollzeichen }
  162. *** Kontrollzeichen ist 'SPACE' oder 'TAB' oder Zeilenende oder
  163. *** ein beliebiges nichtdruckbares Zeichen (ASCII-Code < 32).
  164. Ende_Punkt          ::= . Kontrollzeichen
  165. Bemerkungen:
  166. (1)  Gemischte  Operatoren  wurden nicht in die  Beschreibung  mit 
  167.      aufgenommen,  aber  die Regeln daf
  168. r haben alle dieselbe Form 
  169.      wie z.B.
  170.      TermN               ::= Op[xfy,fx],N TermN-1
  171.      (es gibt noch 11 weitere Regeln f
  172. r gemischte Operatoren).
  173.      In  TOY Prolog kann ein gemischter Operator  h
  174. chstens  einen 
  175.      un
  176. ren  und einen bin
  177. ren Typ besitzen,  beide mit  derselben 
  178.      Priorit
  179. (2)  Es gibt viele mehrdeutige Kombinationen von zusammenh
  180. ngenden 
  181.      Operatoren, die nicht von dieser Beschreibung erfa
  182. t werden.
  183. (3)  Nicht  alle Funktoren (z.B.  Namen in Apostrophen) k
  184. nnen als 
  185.      Operatoren vereinbart werden.
  186. (4)  In  der  Beschreibung  von Rumpf  h
  187. tte  man  die  gesonderte 
  188.      Betrachtung  von , / 2 und ; / 2 weglassen k
  189. nnen,  da  beide 
  190.      normalerweise als Infix-Operatoren vereinbart sind. Die Regel
  191.      Rumpf ::= Funktor_Term
  192.      h
  193. tte  aber  die  im  Regelfall  auftretende  Struktur  eines 
  194.      Rumpfes verschleiert.
  195. (5)  Die Syntax f
  196. r Direktiven (Kommandos und Anfragen) orientiert 
  197.      sich an der in TOY Prolog verwendeten Benutzerschnittstelle.
  198. (6)  Kommentare  und  Leerraum  k
  199. nnen  beliebig  vor  und  hinter 
  200.      Zeichengruppen  eingesetzt  werden,  nicht jedoch  im  Innern 
  201.      einer Zeichengruppe. Ein Kommentar erstreckt sich nur bis zum 
  202.      n
  203. chsten Zeilenende.
  204. (7)  Zwischen einem Minuszeichen, das als Funktor behandelt werden 
  205.      soll,  und einer vorzeichenlosen Integerzahl mu
  206.  ein Leerraum 
  207.      stehen.  Ein  Minuszeichen direkt vor einer Ziffernfolge wird 
  208.      als Vorzeichen betrachtet.
  209. (8)  Ein  eingegebener  Term mu
  210.  mit einem  Ende_Punkt  (au
  211. erhalb 
  212.      eines apostrophiertens Namens,  einer Zeichenkette oder eines 
  213.      Kommentares) abgeschlossen werden
  214. (9)  TOY  Prolog benutzt einen  einfachen  Unifikationsalgorithmus 
  215.      ohne 'occurrence check'. Daher k
  216. nnen z.B. die Terme 
  217.           X         und            f(X)
  218.      unifiziert werden. Dabei entstehen zyklische Datenstrukturen, 
  219.      die bei unvorsichtiger Programmierung den Interpreter bei der 
  220.      Ausgabe  oder der Unifikation in eine  Endlosschleife  f
  221. hren 
  222.      k
  223. nnen. Bei solchen Strukturen ist daher Vorsicht geboten.
  224.      II.2 Die Benutzerschnittstelle
  225. Die  Benutzerschnittstelle  von TOY Prolog ist  in  Prolog  selbst 
  226. geschrieben.  Dabei  wurde  ein  Zwischencode verwendet,  der  nur 
  227. leichte   Einschr
  228. nkungen  gegen
  229. ber  der   vollst
  230. ndigen   Syntax 
  231. aufweist, der aber leicht in den vom inneren Interpreter benutzten 
  232. Code 
  233. bersetzt werden kann. N
  234. heres dazu im Anhang.
  235. Der  innere Interpreter ruft das Pr
  236. dikat ear / 0 auf,  sobald  er 
  237. vom Benutzer-Eingabestrom 'user' lesen soll. 
  238. Dieses  Pr
  239. dikat ruft die Hauptschleife des  
  240. eren  Interpreters 
  241. auf; ihr Name ist loop / 0.
  242. In der Schleife wird der Benutzer durch den Prompt
  243. aufgefordert, einen Term einzugeben, der danach auf folgende Weise 
  244. ausgef
  245. hrt wird :
  246. (1)  Variablen oder fehlerhafte Terme werden ignoriert.
  247. (2)  Zahlen erzeugen eine Fehlermeldung.
  248. (3)  Terme der Form "Kopf :- Rumpf" oder "Links --> Rechts" werden 
  249.      als  Regeln in die Datenbank 
  250. bernommen (grammatische  Regeln 
  251.      mit '-->' werden vorher 
  252. bersetzt).
  253. (4)  Terme der Form ":- Rumpf" werden als Kommandos angesehen  und 
  254.      deterministisch ausgef
  255. (5)  Eine  Liste  wird als Liste von  Dateinamen  betrachtet.  Zur 
  256.      Auswertung   der   Liste  wird  das   Pr
  257. dikat   'consultall' 
  258.      aufgerufen.
  259. (6)  Alle  anderen Terme werden als Anfragen behandelt :  es  wird 
  260.      versucht,  das beschriebene Ziel zu erf
  261. llen. Gelingt das, so 
  262.      werden    die    resultierenden     Variableninstantiierungen 
  263.      ausgegeben,  und der Interpreter wartet auf die Eingabe eines 
  264.      Zeichens.  Ist  es  das  Zeichen ';',  so wird versucht,  die 
  265.      Anfrage neu zu erf
  266. llen.
  267.      Enth
  268. lt  die  Anfrage keine Variablen,  so wird bei  Gelingen 
  269.      'yes' ausgegeben.
  270.      Schl
  271. gt die Anfrage fehl, so wird 'no' ausgegeben.
  272. Durch Aufruf des Pr
  273. dikats 'stop' wird das Programm abgebrochen.
  274.      III. Systemfunktionen und vordefinierte Pr
  275. dikate
  276.      III.1 Allgemeines
  277. Systemfunktionen  sind Funktionen,  die im eigentlichen  (inneren) 
  278. Interpreter  implementiert sind,  vordefinierte Pr
  279. dikate sind  in 
  280. Prolog geschrieben und werden nach dem Start des Interpreters  aus 
  281. der Systemdatei 'SYSFILE.TOY' gelesen (siehe dazu den Anhang).
  282. Die  grundlegenden  Funktionen von Prolog-10  werden  durch  diese 
  283. beiden  Gruppen  abgedeckt.  In  der  ATARI-Version  wurden  viele 
  284. tzliche  Systemfunktionen implementiert,  die den Zugriff  auf 
  285. spezielle   Eigenschaften  des  ST  (GEM  -   Grafikroutinen   und 
  286. Echtzeituhr) erm
  287. glichen.
  288. Eine Systemfunktion kann drei verschiedene Ergebnisse produzieren: 
  289. sie  kann  fehlschlagen,  erf
  290. llt werden,  oder einen Systemfehler 
  291. produzieren.   Wird   eine   Systemfunktion  erf
  292. llt,   so  treten 
  293. blicherweise Nebeneffekte auf (z.B. Ausgabefunktionen).
  294. Ein auftretender Fehler kann zur Folge haben, da
  295.  der Versuch, das 
  296. aktuelle Ziel zu erf
  297. llen,  vollst
  298. ndig abgebrochen wird;  es kann 
  299. sogar (bei Speicher
  300. berlauf) zum Abbruch des Interpreters  kommen. 
  301. Ein derart schwerwiegender Fehler wird durch die Meldung
  302. "Fatal error :  ..." angezeigt.  Nach einem solchen Fehler startet 
  303. der  Interpreter  selbst
  304. ndig das Pr
  305. dikat ear /  0,  falls  nicht 
  306. gerade  eine  Datei  eingelesen wird.  Im Falle von  Fehlern  beim 
  307. ffnen  oder  Schlie
  308. en  von Dateien  werden  vorher  Eingabe  und 
  309. Ausgabe wieder auf Tastatur bzw. Bildschirm umgeleitet.
  310. Im  Normalfall  wird  ein  Fehler  jedoch  durch  andere  Umst
  311. verursacht,  z.B.  durch  fehlerhafte  Parameter beim Aufruf einer 
  312. Systemfunktion.  In  diesem Fall wird die Erf
  313. llung des  aktuellen 
  314. Zieles  nicht  abgebrochen;  es wird fortgefahren,  als ob der den 
  315. Fehler verursachende Term ein Aufruf des Pr
  316. dikats error / 1 ist.
  317. Das  Argument  von  error(...) ist dabei  der  fehlerhafte  Aufruf 
  318. selbst.  error  / 1 ist in Prolog geschrieben und befindet sich in 
  319. der   Systemdatei;   der   Benutzer  kann  eigene   Fehlerroutinen 
  320. schreiben. error(...) kann auch explizit aufgerufen werden. In der 
  321. vorliegenden Version gibt error(Call) eine Meldung der Form
  322. "System call error : Call" aus, wenn der 
  323. erste Funktor von Call 
  324. eine Systemfunktion bezeichnet, andernfalls einfach
  325. "Error : Call". Nach der Ausgabe schl
  326. gt error / 1 fehl.
  327.      III.2 Beschreibung der Systemfunktionen und vordefinierten
  328.            Pr
  329. dikate
  330. Bemerkung:     In den folgenden Beschreibungen werden Aussagen wie 
  331.                "ein Pr
  332. dikat versucht,  zwei Terme zu unifizieren" 
  333.                gemacht, wenn das Pr
  334. dikat je nach dem Ergebnis der 
  335.                Unifikation fehlschl
  336. gt oder erf
  337. llt wird. Nach der 
  338.                Erf
  339. llung sind die Terme unifiziert.
  340.                "Ein  Pr
  341. dikat pr
  342. ft eine Bedingung" bedeutet,  da
  343.                es  je nach dem Ergebnis der Bedingung  fehlschl
  344.                oder erf
  345. llt wird.
  346. Parameter werden in den Beschreibungen wie folgt bezeichnet :
  347.      TERM      irgendein Term
  348.      INTEGER   eine Integer-Zahl
  349.      VAR       eine Variable
  350.      VARINT    eine Integer-Zahl oder eine Variable
  351.      F_TERM    ein  Term  mit  Funktor und  keinem  oder  mehreren 
  352.                Argumenten
  353.      AUFRUF    siehe  F_TERM (aber im Sinne eines  zu  erf
  354. llenden 
  355.                Zieles)
  356.      ATOM      ein Funktor ohne Argumente
  357.      NAME      siehe  ATOM (aber die betrachtete Funktion  bezieht 
  358.                sich auf den druckbaren Namen des Funktors)
  359.      ZEICHEN   ein aus einem einzelnen Zeichen bestehender NAME
  360.      DATEINAME der  Name eines Standard-Ein-/Ausgabestroms  (siehe 
  361.                die   Funktionen   see/tell   etc.),    oder   eine 
  362.                Spezifikation f
  363. r eine Diskettendatei des TOS, also 
  364.                z.B. 'B:\ORDNER.1\PROLOG\DATEN.PRO'
  365.      AUFRUFLISTE    eine (m
  366. glicherweise leere) Liste von AUFRUFEN
  367.      ZEICHENLISTE   eine (m
  368. glicherweise leere) Liste von ZEICHEN
  369.      ZIFFERNLISTE   eine ZEICHENLISTE aus Ziffernzeichen
  370. Die Parameter des beschriebenen Pr
  371. dikates werden mit PAR_1, PAR_2 
  372. usw. bezeichnet.
  373. In  TOY  Prolog  existieren vordefinierte  Operatoren,  von  denen 
  374. einige  die Namen von Pr
  375. dikaten sind.  Eine Liste davon  befindet 
  376. sich bei der Beschreibung von op / 3 in Abschnitt III.2.5.4.
  377.      III.2.1 Allgemeine Pr
  378. dikate
  379. true 
  380.                kann immer erf
  381. llt werden.
  382. fail 
  383.                schl
  384. gt immer fehl.
  385. not AUFRUF
  386.                wird erf
  387. llt genau dann, wenn AUFRUF fehlschl
  388. AUFRUF, AUFRUF
  389.                wird  genau  dann  erf
  390. llt,  wenn  beide  Parameter 
  391.                erf
  392. llt werden k
  393. nnen.
  394. AUFRUF; AUFRUF
  395.                wird  genau dann erf
  396. llt,  wenn einer der Parameter 
  397.                erf
  398. llt werden kann.
  399. check (AUFRUF)
  400.                wird genau dann erf
  401. llt, wenn der Parameter erf
  402.                werden kann, aber instantiiert keine Variablen.
  403. side_effects (AUFRUF)
  404.                
  405. quivalent zu check(AUFRUF); sollte benutzt werden, 
  406.                um  zu  betonen,  da
  407.  die Seiteneffekte von  AUFRUF 
  408.                wichtig sind.
  409. once (AUFRUF)
  410.                versucht,  AUFRUF deterministisch (genau einmal) zu 
  411.                erf
  412. llen.
  413.      III.2.2 Arithmetik mit Integer-Zahlen
  414. sum (INTEGER, INTEGER, INTEGER)
  415.                wird erf
  416. llt genau dann, wenn PAR_1+PAR_2 = PAR_3.
  417. sum (INTEGER, INTEGER, VAR)
  418.                wird  erf
  419. llt,  nachdem  PAR_3  mit  dem  Wert  von 
  420.                PAR_1+PAR_2 unifiziert wurde.
  421. sum (INTEGER, VAR, INTEGER)
  422.                wird   erf
  423. llt,  nachdem  PAR_2  mit dem  Wert  von 
  424.                PAR_3-PAR_1 unifiziert wurde.
  425. sum (VAR, INTEGER, INTEGER)
  426.                wird  erf
  427. llt,  nachdem  PAR_1   mit  dem Wert  von 
  428.                PAR_3-PAR_2 unifiziert wurde.
  429. prod (INTEGER, INTEGER, INTEGER, INTEGER)
  430.                wird  erf
  431. llt genau dann,  wenn PAR_1*PAR_2+PAR_3 = 
  432.                PAR_4.
  433. prod (INTEGER, INTEGER, INTEGER, VAR)
  434.                wird  erf
  435. llt,  nachdem  PAR_4 mit dem   Wert   von 
  436.                PAR_1*PAR_2+PAR_3 unifiziert wurde.
  437. prod (INTEGER, INTEGER, VAR, INTEGER)
  438.                wird  erf
  439. llt,  nachdem  PAR_3 mit  dem   Wert  von 
  440.                PAR_4-PAR_1*PAR_2 unifiziert wurde.
  441. prod (INTEGER, VAR, VAR, INTEGER)
  442.                wird  erf
  443. llt,  nachdem  PAR_2  mit  dem  Wert  von 
  444.                PAR_4  div PAR_1 und PAR_3 mit dem Wert  von  PAR_4 
  445.                mod PAR_1 unifiziert wurde.
  446. prod (VAR, INTEGER, VAR, INTEGER)
  447.                wie  der vorherige Fall,  aber PAR_1 vertauscht mit 
  448.                PAR_2.
  449. prod (INTEGER, VAR, INTEGER, INTEGER)
  450.                schl
  451. gt fehl, wenn (PAR_4-PAR_3) mod PAR_1 ungleich 
  452.                0  ist;  andernfalls wird es erf
  453. lt,  nachdem PAR_2 
  454.                mit dem Wert von (PAR_4-PAR_3) div PAR_1 unifiziert 
  455.                wurde.
  456. prod (VAR, INTEGER, INTEGER, INTEGER)
  457.                wie  der vorherige Fall,  aber PAR_1 vertauscht mit 
  458.                PAR_2.
  459. TERM is TERM
  460.                Es wird angenommen,  da
  461.  PAR_2 ein aus INTEGERs und 
  462.                den  Standardoperatoren  +,  -  (beide  bin
  463. r  oder 
  464.                un
  465. r),    *,    /    und    mod   zusammengesetzter 
  466.                arithmetischer Ausdruck ist;  falls nicht,  schl
  467.                das  Pr
  468. dikat fehl (es kann auch  zu  Systemfehlern 
  469.                kommen, falls PAR_2 freie Variablen enth
  470.                Falls  PAR_2  ein  Ausdruck  ist,  wird  sein  Wert 
  471.                berechnet und versucht, PAR_1 damit zu unifizieren. 
  472.                is   kann auch eine Liste der Form [ INTEGER ]  als 
  473.                den  Wert dieser Integer-Zahl berechnen  (nach  den 
  474.                Konventionen von Prolog-10).
  475.                is  wird von anderen Pr
  476. dikaten benutzt,  die  ihre 
  477.                Argumente als Ausdr
  478. cke ansehen,z.B. den folgenden.
  479.      III.2.3 Vergleich von Zahlen bzw. Namen
  480. less (INTEGER, INTEGER)
  481.                wird erf
  482. llt genau dann, wenn PAR_1 < PAR_2.
  483. TERM =:= TERM
  484.                wird  erf
  485. llt  genau  dann,  wenn PAR_1  und  PAR_2 
  486.                arithmetische  Ausdr
  487. cke sind,  die denselben  Wert 
  488.                haben.
  489. TERM =\= TERM  ( =\= )
  490.                wie =:=,  aber 
  491. berpr
  492. ft,  ob die Werte verschieden 
  493.                sind.
  494. TERM < TERM    ( < )
  495.                wie  =:=,  aber  
  496. berpr
  497. ft,  ob der Wert von  PAR_1 
  498.                kleiner als der Wert von PAR_2 ist.
  499. TERM =< TERM   ( =< )
  500.                wie <, aber 
  501. berpr
  502. ft auf "kleiner oder gleich".
  503. TERM > TERM    ( > )
  504.                wie <, aber 
  505. berpr
  506. ft auf "gr
  507. TERM >= TERM   ( >= )
  508.                wie <, aber 
  509. berpr
  510. ft auf "gr
  511. er oder gleich".
  512. NAME @< NAME   ( @< )
  513.                wird  genau dann erf
  514. llt,  wenn PAR_1 in der  durch 
  515.                den  erweiterten  ASCII-Zeichensatz  des  ATARI  ST 
  516.                definierten lexikographischen Reihenfolge vor PAR_2 
  517.                steht.
  518. NAME @=< NAME  ( @=< )
  519.                wie @<, aber 
  520. berpr
  521. ft auf "kleiner oder gleich".
  522. NAME @> NAME   ( @> )
  523.                wie @<, aber 
  524. berpr
  525. ft auf "gr
  526. NAME @>= NAME  ( @>= )
  527.                wie @<, aber 
  528. berpr
  529. ft auf "gr
  530. er oder gleich".
  531.      III.2.4 Vergleich von Termen
  532. TERM = TERM
  533.                versucht, PAR_1 und PAR_2 zu unifizieren.
  534. eqvar (VAR, VAR)
  535.                wird genau dann erf
  536. llt,  wenn PAR_1 und PAR_2 zwei 
  537.                Instanzen derselben, nicht-anonymen Variable sind.
  538. TERM == TERM
  539.                wird genau dann erf
  540. llt,  wenn PAR_1 und PAR_2 zwei 
  541.                Instanzen desselben Terms sind.
  542. TERM \== TERM  ( \== )
  543.                wird genau dann erf
  544. llt, wenn PAR_1 und PAR_2 nicht 
  545.                zwei Instanzen desselben Terms sind.
  546.      III.2.5 Ein- und Ausgabe
  547.      III.2.5.1 Datenstr
  548. Die  Ein-  und  Ausgabe  in TOY  Prolog  ST  ist  an  Datenstr
  549. orientiert. Ein Datenstrom ist (vom Benutzer aus gesehen) der Name 
  550. bzw. die vollst
  551. ndige Spezifikation einer Diskettendatei, oder der 
  552. vordefinierte Name eines speziellen Ein- oder Ausgabeger
  553. Auf eine Diskettendatei kann - sofern sie nicht vom Betriebssystem 
  554. aus  gegen  
  555. berschreiben gesch
  556. tzt ist,  und sie sich  nicht  auf 
  557. einer schreibgesch
  558. tzten Diskette befindet,  schreibend und lesend 
  559. zugegriffen werden. Namen von Datei-Str
  560. men k
  561. nnen z.B. sein :
  562. editor         (eines der Hilfsprogramme)
  563. 'sysfile.toy'  (die Systemdatei)
  564. 'b:\ordner.1\daten' (eine Datei namens 'daten' auf einer  Diskette 
  565.                     im Laufwerk B im Ordner 'ordner.1')
  566. Bei  Datei-Str
  567. men  k
  568. nnen  Gro
  569. -  und  Kleinschreibung   beliebig 
  570. hlt werden.
  571. Ein Dateistrom kann nur in eine Richtung, also nur lesend oder nur 
  572. schreibend, ge
  573. ffnet werden. Wird ein Dateistrom mehrmals in einer 
  574. Richtung ge
  575. ffnet, so hat das keine Wirkung.
  576. Die  vordefinierten  Datenstr
  577. me sind vorhanden,  um  mit  anderen 
  578. ten bzw. Komponenten des Computers zu kommunizieren.
  579. Auf  die  vordefinierten Datenstr
  580. me kann nicht immer  lesend  und 
  581. schreibend zugegriffen werden,  aber ein vordefinierter Datenstrom 
  582. kann,  falls  Lese-  und  Schreibzugriff erlaubt  sind,  in  beide 
  583. Richtungen gleichzeitig ge
  584. ffnet werden.
  585. Eine  Liste  der  vordefinierten  Datenstr
  586. me  mit  den  erlaubten 
  587. Zugriffsarten :
  588.      Name      Lesezugriff                   Schreibzugriff
  589.      user      Standard-Benutzereingabe      Standard-Benutzerausgabe
  590.                (Tastatur, gepuffert)         (Bildschirm)
  591.      keybd     Benutzereingabe               Ausgabe an den
  592.                (Tastatur, Einzelzeichen)     Tastaturcontroller.
  593.      modem     RS232-Interface lesen         RS232 schreiben
  594.      midi      MIDI-Interface lesen          MIDI schreiben
  595.      printer   nicht erlaubt !               Centronics-Interface
  596. Diese Namen k
  597. nnen wieder gro
  598. - oder kleingeschrieben werden  (bei 
  599. schreibung Apostrophen nicht vergessen).
  600.      III.2.5.2 Umschalten der Ein- und Ausgabestr
  601. nnen bis zu 16 Dateistr
  602. me gleichzeitig offen sein.
  603. see (DATEINAME)
  604.                der   angegebene  Datenstrom  wird  zum   aktuellen 
  605.                Eingabestrom;  handelt  es sich um eine noch  nicht 
  606.                ge
  607. ffnete Datei, so wird diese zum Lesen ge
  608. ffnet.
  609. seeing (TERM)
  610.                versucht,   den   Parameter   mit   dem   aktuellen 
  611.                Eingabestrom zu unifizieren.
  612. seen 
  613.                ist der aktuellen Eingabestrom eine Datei,  so wird 
  614.                sie   geschlossen.   Der  vordefinierte  Datenstrom 
  615.                'user' wird zum aktuellen Eingabestrom.
  616. tell (DATEINAME)
  617.                der   angegebene  Datenstrom  wird  zum   aktuellen 
  618.                Ausgabestrom;  handelt  es sich um eine noch  nicht 
  619.                ge
  620. ffnete  Datei,  so  wird diese auf der  Diskette 
  621.                erzeugt  (eine eventuell vorhandene Datei  mit  dem 
  622.                gleichen  Namen wird gel
  623. scht !) und zum  Schreiben 
  624.                ge
  625. ffnet.
  626. telling (TERM)
  627.                versucht,   den   Parameter   mit   dem   aktuellen 
  628.                Ausgabestrom zu unifizieren.
  629. told 
  630.                ist  der aktuelle Ausgabestrom eine Datei,  so wird 
  631.                sie   geschlossen.   Der  vorgefinierte  Datenstrom 
  632.                'user' wird zum aktuellen Ausgabestrom.
  633.      III.2.5.3 Kontrolle der Eingabe
  634. TOY  Prolog besitzt die F
  635. higkeit,  die von einem Dateistrom  oder 
  636. einem  Peripherieger
  637. t eingelesenen Zeichen zur Kontrolle auf  dem 
  638. Bildschirm auszugeben.
  639. echo 
  640.                schaltet die Kontrollausgabe ein.
  641. noecho 
  642.                schaltet die Kontrollausgabe aus.
  643.      III.2.5.4 Ein- und Ausgabe von Termen; Operatoren
  644. display (TERM)
  645.                gibt   TERM  in  Standardform  auf  den   aktuellen 
  646.                Ausgabestrom  aus :  Funktoren werden in Pr
  647. fixform 
  648.                mit  Klammern  ausgegeben,  Namen werden  nicht  in 
  649.                Apostrophen   gesetzt;   Variablen  werden  als  _N 
  650.                ausgegeben, wobei N eine Zahl ist.
  651. write (TERM)
  652.                gibt  TERM auf den aktuellen Ausgabestrom aus;  die 
  653.                momentanen Operatorvereinbarungen werden  beachtet, 
  654.                aber  Namen  werden nicht in  Apostrophen  gesetzt. 
  655.                Variablen werden in der Form XN ausgegeben, wobei N 
  656.                eine Zahl ist; die Numerierung beginnt bei 1.
  657.                Achtung  :  In  TOY  Prolog wird  zur  Ausgabe  von 
  658.                Variablen  ein Pr
  659. dikat benutzt,  das die Variablen 
  660.                numeriert,  indem  es sie an Terme der Form  'V'(N) 
  661.                bindet.  Aus  diesem  Grund werden Terme  der  Form 
  662.                'V'(N)  nicht  korrekt  ausgegeben,   wenn  N  eine 
  663.                Integer-Zahl ist.
  664. writeq (TERM)
  665.                wie  'write',  aber Namen,  die keine wohlgeformten 
  666.                Worte  darstellen,  oder  die in Konflikt zu  einer 
  667.                momentanen  Operatorvereinbarung stehen,  werden in 
  668.                Apostrophen  gesetzt.   Terme,   die  mit  'writeq' 
  669.                ausgegeben   wurden,   k
  670. nnen  mit  'read'   wieder 
  671.                eingelesen werden.
  672. read (TERM)
  673.                liest einen durch einen Punkt abgeschlossenen  Term 
  674.                vom aktuellen Eingabestrom;  wird nur erf
  675. llt, wenn 
  676.                dieser  Term mit PAR_1 unifiziert werden kann.  Die 
  677.                momentanen Operatorvereinbarungen werden  beachtet. 
  678.                Falls  der  eingegebene  Term  syntaktische  Fehler 
  679.                enth
  680. lt, so wird die Meldung
  681.                "Bad Term on input. Text skipped:"
  682.                ausgegeben,   und  der  eingegebene  Text  bis  zum 
  683.                n
  684. chsten  Punkt  au
  685. erhalb  eines  Kommentares  und 
  686.                au
  687. erhalb von Anf
  688. hrungszeichen 
  689. bersprungen (falls 
  690.                kein  Punkt vorhanden ist,  sollte der Benutzer ihn 
  691.                eingeben).  Danach wird versucht, PAR_1 mit 'e r r' 
  692.                zu unifizieren.
  693.                Am  Ende  eines Dateistromes wird die  Eingabe  auf 
  694.                'user' umgeschaltet.
  695. op (INTEGER, ATOM, ATOM)
  696.                vereinbart  PAR_3  als Operator mit Typ  PAR_2  und 
  697.                Priorit
  698. t  PAR_1.  Es mu
  699.  gelten 1 
  700.  PAR_1 
  701.   1200; 
  702.                Operatoren  mit kleinerer Priorit
  703. t haben  Vorrang. 
  704.                Die  Priorit
  705. t  sollte kleiner als  1000  sein,  um 
  706.                Konflikte  mit den  Operatoren ',', ';', ':-'   und 
  707.                '-->' zu vermeiden.
  708.                PAR_2 mu
  709.  aus der Menge { xf, yf, fx, fy, xfx, xfy, 
  710.                yfx,   yfy   }  gew
  711. hlt  werden.   PAR_3  mu
  712.   ohne 
  713.                Apostrophen druckbar sein.
  714.                Falls  f
  715. r PAR_3 bereits eine  Operatorvereinbarung 
  716.                besteht,  so wird diese gem
  717.  den Angaben von PAR_1 
  718.                und PAR_2, modifiziert : die neue Priorit
  719. t ersetzt 
  720.                die  alte  und  der neue un
  721. re  (bzw.  bin
  722. re)  Typ 
  723.                ersetzt den alten un
  724. ren (bzw. bin
  725. ren) Typ. In TOY 
  726.                Prolog kann ein Operator nur einen un
  727. ren und einen 
  728.                bin
  729. ren  Typ gleichzeitig besitzen (beide  mit  der 
  730.                gleichen Priorit
  731. delop (ATOM)
  732.                die  Operatorvereinbarung f
  733. r PAR_1 wird  gel
  734. scht. 
  735.                PAR_1  sollte in Apostrophen gesetzt werden,  da es 
  736.                zum  Zeitpunkt der Eingabe von 'delop' ja noch  ein 
  737.                Operator ist.
  738. Folgende Standardoperatoren sind bereits vereinbart :
  739.                :-        xfx, fx        1200
  740.                -->       xfx            1200
  741.                ;         xfy            1100
  742.                ,         xfy            1000
  743.                not       fy             900
  744.                =         xfx            700
  745.                is        xfx            700
  746.                =:=       xfx            700
  747.                =\=       xfx            700
  748.                <         xfx            700
  749.                =<        xfx            700
  750.                >         xfx            700
  751.                >=        xfx            700
  752.                @<        xfx            700
  753.                @=<       xfx            700
  754.                @>        xfx            700
  755.                @>=       xfx            700
  756.                ==        xfx            700
  757.                \==       xfx            700
  758.                =..       xfx            700
  759.                +         yfx, fx        500
  760.                -         yfx, fx        500
  761.                *         yfx            400
  762.                /         yfx            400
  763.                mod       xfx            300
  764.      III.2.5.5 Einzelzeichen
  765. In TOY Prolog werden Einzelzeichen, anders als in Prolog-10, durch 
  766. Atome dargestellt, deren Namen aus genau einem Zeichen besteht (in 
  767. Prolog-10 als deren ASCII-Darstellung, also als Zahlen).
  768. TOY  Prolog  ST unterst
  769. tzt den erweiterten Zeichensatz  von  GEM; 
  770. dabei  werden deutsche (franz
  771. sische,  spanische,  ...) Buchstaben 
  772. auch wirklich als Buchstaben erkannt (!).
  773. r  Zeichenketten  existiert  eine  besondere   Darstellungsform. 
  774. Zeichenketten  werden  als  Listen  von  Einzelzeichen  betrachtet 
  775. (nicht wie in Prolog-10 als Listen von ASCII-Codes);  die Notation 
  776. r   Zeichenketten   benutzt  Anf
  777. hrungszeichen  ("),   um   eine 
  778. Zeichenkette    einzuschlie
  779. en.    Wie   
  780. blich   bezeichnet   ein 
  781. verdoppeltes Anf
  782. hrungszeichen ("") im Inneren einer  Zeichenkette 
  783. ein in die Zeichenkette aufzunehmendes einzelnes ".
  784. Die   folgenden   Pr
  785. dikate   sind  f
  786. r   die   Verarbeitung   von 
  787. Einzelzeichen vorgesehen:
  788. ordchr (INTEGER, ZEICHEN)
  789.                wird genau dann erf
  790. llt, wenn PAR_1 die Ordinalzahl 
  791.                des Zeichens PAR_2 ist.
  792. ordchr (VAR, ZEICHEN)
  793.                wird erf
  794. llt, nachdem PAR_1 mit der Ordinalzahl von 
  795.                PAR_2 unifiziert wurde.
  796. ordchr (INTEGER, VAR)
  797.                wird   erf
  798. llt,   nachdem  PAR_2  mit  dem  Zeichen 
  799.                unifiziert wurde,  dessen Ordinalzahl PAR_1 mod 256 
  800.                ist.
  801. iseoln (TERM)
  802.                versucht,   PAR_1   mit  dem  Zeilenendezeichen  zu 
  803.                unifizieren. TOY Prolog wandelt jedes Zeilenende in 
  804.                ein einzelnes 'CR' um.
  805. smalletter (TERM)
  806.                
  807. berpr
  808. ft, ob PAR_1 ein Kleinbuchstabe ist.
  809. bigletter (TERM)
  810.                
  811. berpr
  812. ft, ob PAR_1 ein Gro
  813. buchstabe ist.
  814. letter (TERM)
  815.                
  816. berpr
  817. ft, ob PAR_1 ein Buchstabe ist.
  818. digit (TERM)
  819.                
  820. berpr
  821. ft, ob PAR_1 eine Dezimalziffer ist.
  822. alphanum (TERM)
  823.                
  824. berpr
  825. ft, ob PAR_1 ein Buchstabe, eine Ziffer oder 
  826.                ein Tiefstrich (_) ist.
  827. bracket (TERM)
  828.                
  829. berpr
  830. ft,  ob  PAR_1 eines der Zeichen ( ) [ ] { } 
  831.                ist.
  832. solochar (TERM)
  833.                
  834. berpr
  835. ft, ob PAR_1 eines der Zeichen ! , ; ist.
  836. symch (TERM)
  837.                
  838. berpr
  839. ft, ob PAR_1 ein Symbolzeichen ist.
  840.      III.2.5.6 Ein- und Ausgabe von Einzelzeichen
  841. r  die  Ein- und Ausgabe von Einzelzeichen gibt es  eine  Anzahl 
  842. besonderer  Pr
  843. dikate.  Diese arbeiten nicht - wie in Prolog-10  - 
  844. mit  ASCII-Codes.  Die  Pr
  845. dikate von Prolog-10,  die die Ein- und 
  846. Ausgabe  von  Einzelzeichen  erledigen,  k
  847. nnten  etwa  wie  folgt 
  848. definiert werden (nicht vollst
  849. ndig kompatibel):
  850.      get0(Ord) :- rch, lastch(Ch), ordchr(Ord, Ch).
  851.      get(Ord)  :- rch, skipbl, lastch(Ch), ordchr(Ord, Ch).
  852.      skip(X)   :- repeat, get0(X), !.
  853.      put(Ord)  :- ordchr(Ord, Ch), wch(Ch).
  854. Der  Hauptunterschied  zwischen TOY Prolog und Prolog-10  bei  der 
  855. Verarbeitung  von Einzelzeichen liegt darin,  da
  856.  TOY Prolog einen 
  857. Puffer f
  858. r das letzte eingegebene Zeichen unterh
  859. lt; in TOY Prolog 
  860. kann daher mehrmals,  auch nach eventuellem Backtracking,  auf ein 
  861. eingegebenes Zeichen zugegriffen werden.
  862. Wird  bei der Eingabe ein Zeilenende erreicht,  so wird es als ein 
  863. einzelnes   'CR'   in  den   Eingabepuffer   ("letztes   Zeichen") 
  864. geschrieben.  Wird das Ende eines Dateistromes erreicht,  so f
  865. der Interpreter selbst
  866. ndig das Pr
  867. dikat 'seen' aus; die folgenden 
  868. Zeichen werden vom Benutzerstrom gelesen.  Dieser Vorgang wird dem 
  869. Benutzer durch eine Meldung mitgeteilt.
  870. Die Pr
  871. dikate f
  872. r die Ein- und Ausgabe von Einzelzeichen :
  873.                wird  erf
  874. llt,  nachdem  das  n
  875. chste  Zeichen  vom 
  876.                aktuellen   Eingabestrom  in  das  letzte   Zeichen 
  877.                geschrieben wurde.
  878. skipbl 
  879.                wird erf
  880. llt, nachdem sichergestellt wurde, da
  881.  das 
  882.                letzte  Zeichen  ein druckbares    Zeichen  enth
  883.                (ASCII-Code  >  32).   Falls  ein  solches  Zeichen 
  884.                bereits  im  letzten  Zeichen  steht,  wird  nichts 
  885.                getan, andernfalls wird 'rch' ausgef
  886. lastch (TERM)
  887.                versucht,   PAR_1   mit  dem  letzten  Zeichen   zu 
  888.                unifizieren.
  889. rdch (TERM)
  890.                liest  das  n
  891. chste Zeichen  vom  Eingabestrom  und 
  892.                schreibt es in das letzte Zeichen; macht eine Kopie 
  893.                des letzten Zeichens,  wobei nichtdruckbare Zeichen 
  894.                als Leerraum angesehen werden;  versucht, die Kopie 
  895.                mit PAR_1 zu unifizieren.
  896. rdchsk (TERM)
  897.                wie 'rdch', aber vorher wird 'skipbl' ausgef
  898. wch (ZEICHEN)
  899.                schreibt das Zeichen in den aktuellen Ausgabestrom. 
  900.                'CR' wird als Zeilentrenner interpretiert.
  901.                beendet die momentane Zeile (gibt 'CR' aus).
  902. bell 
  903.                gibt  das  Zeichen 'Bel' aus;  bei Ausgabe auf  den 
  904.                Benutzerstrom  bewirkt dieses Zeichen  das  Ert
  905.                eines 'Glockentones'.
  906. Der  ATARI  ST  interpretiert  das  Zeichen  'Esc'  (escape)   als 
  907. besonderes   Steuerzeichen;   wird  'Esc'  auf  den  Benutzerstrom 
  908. ausgegeben,  so bewirken die n
  909. chsten 1-3 Zeichen eine Ver
  910. nderung 
  911. von  Parametern  der Bildschirmausgabe.  Es  existieren  spezielle 
  912. dikate zur Ausgabe von Escape-Sequenzen :
  913. escape 
  914.                gibt 'Esc' aus.
  915.                gibt  'Esc',  'E'  aus;  der Bildschirminhalt  wird 
  916.                gel
  917. scht.
  918.      III.2.6 Typen
  919. berpr
  920. var (TERM)
  921.                wird  genau  dann erf
  922. llt,  wenn PAR_1  eine  freie 
  923.                Variable ist.
  924. integer (TERM)
  925.                wird  genau dann erf
  926. llt,  wenn PAR_1 eine Integer-
  927.                Zahl ist.
  928. nonvarint (TERM)
  929.                wird genau dann erf
  930. llt, wenn PAR_1 ein F_TERM ist.
  931. atom (TERM)
  932.                wird genau dann erf
  933. llt, wenn PAR_1 ein ATOM ist.
  934.      III.2.7 Zugriff auf die Termstruktur
  935. pname (NAME, TERM)
  936.                erzeugt eine Liste der einzelnen Zeichen von  PAR_1 
  937.                und versucht, diese Liste mit PAR_2 zu unifizieren.
  938. pname (VAR, ZEICHENLISTE)
  939.                wird   erf
  940. llt,   nachdem  PAR_1  mit  einem  NAMEn 
  941.                unifiziert wurde, der aus den einzelnen Zeichen von 
  942.                PAR_2 besteht.
  943. pnamei (INTEGER, TERM)
  944.                erzeugt  eine  Liste von  Ziffernzeichen,  die  die 
  945.                dezimale   Darstellung   von  PAR_1   bilden,   und 
  946.                versucht,  diese  Liste  mit PAR_2 zu  unifizieren. 
  947.                PAR_1 darf nicht negativ sein.
  948. pnamei (VAR, ZIFFERNLISTE)
  949.                wird  erf
  950. llt,  nachdem PAR_1 mit der  Integer-Zahl 
  951.                unifiziert  wurde,   deren  Dezimaldarstellung  die 
  952.                Zeichen   von  PAR_2  sind.   Auch  bei   korrekten 
  953.                Parametern kann ein Fehler auftreten, wenn die Zahl 
  954.                gr
  955. er  als  die gr
  956. te  darstellbare  Integer-Zahl 
  957.                wird.  In  dieser  Implementation sind  Zahlen  bis 
  958.                32767 ( = 215-1) darstellbar.
  959. 'pname'  und 'pnamei' ersetzen die Funktion 'name' von  Prolog-10, 
  960. die  zwar 
  961. hnlich arbeitet,  aber ASCII-Codes anstelle der in  TOY 
  962. Prolog verwendeten Zeichendarstellung benutzt.
  963. functor (VAR, INTEGER, 0)
  964.                PAR_3  ist die Zahl 0;  dieser Aufruf wird erf
  965. llt, 
  966.                nachdem PAR_1 mit PAR_2 unifiziert wurde.
  967. functor (VAR, NAME, INTEGER)
  968.                wird  erf
  969. llt,   nachdem  PAR_1  mit  einem  F_TERM 
  970.                unifiziert wurde,  dessen Funktor den Namen und die 
  971.                Stelligkeit   hat,   die  durch  PAR_2  und   PAR_3 
  972.                festgelegt    werden,    und    dessen    Argumente 
  973.                verschiedene freie Variablen sind. PAR_3 darf nicht 
  974.                negativ sein.
  975. functor (INTEGER, TERM, TERM)
  976.                versucht,  PAR_2 mit PAR_1 und PAR_3 mit der Zahl 0 
  977.                zu unifizieren.
  978. functor (F_TERM, TERM, TERM)
  979.                versucht,  PAR_2  mit  dem Namen und PAR_3 mit  der 
  980.                Stelligkeit  des  
  981. ersten Funktors von  PAR_1  zu 
  982.                unifizieren.
  983. arg (INTEGER, F_TERM, TERM)
  984.                schl
  985. gt fehl, falls PAR_1 kleiner als 1 oder gr
  986.                als  die  Stelligkeit des  
  987. ersten  Funktors  von 
  988.                PAR_2 ist;  ansonsten wird versucht,  PAR_3 mit dem 
  989.                PAR_1-ten Argument von PAR_2 zu unifizieren.
  990. VAR =.. [INTEGER]
  991.                wird  erf
  992. llt,  nachdem PAR_1 mit der Zahl in PAR_2 
  993.                unifiziert wurde.
  994. VAR =.. [NAME | TERM]
  995.                falls der TERM in PAR_2 keine 'geschlossene'  Liste 
  996.                ist, wird ein Fehler im Pr
  997. dikat length / 2 erzeugt 
  998.                ('=..'  benutzt 'length').  Ansonsten wird ein Term 
  999.                erzeugt,    dessen    Funktor   NAME   und   dessen 
  1000.                Argumentliste  TERM ist;dieser Term wird mit  PAR_1 
  1001.                unifiziert.
  1002. INTEGER =.. TERM
  1003.                versucht, PAR_2 mit [PAR_1] zu unifizieren.
  1004. F_TERM =.. TERM
  1005.                erzeugt eine Liste, deren Kopf der 
  1006. erste Funktor 
  1007.                von  PAR_1 und deren Rumpf die Liste der  Argumente 
  1008.                von PAR_1 ist;  versucht,  diese Liste mit PAR_2 zu 
  1009.                unifizieren.
  1010.      III.2.8 Zugriff auf Pr
  1011. dikate in der Datenbank
  1012. protect (NAME, INTEGER)
  1013.                sch
  1014. tzt   das   Pr
  1015. dikat  mit   Namen   PAR_1   und 
  1016.                Stelligkeit  PAR_2  gegen Ver
  1017. nderungen  durch  die 
  1018.                weiter unten angegebenen Pr
  1019. dikate.
  1020. protect 
  1021.                sch
  1022. tzt  s
  1023. mtliche  in  der  Datenbank  vorhandenen 
  1024.                Pr
  1025. dikate.
  1026. unprotect (NAME, INTEGER)
  1027.                hebt  den Schutz f
  1028. r das Pr
  1029. dikat mit  Namen  PAR_1 
  1030.                und Stelligkeit PAR_2 wieder auf.
  1031. unprotect 
  1032.                hebt den Schutz aller Pr
  1033. dikate auf.
  1034. Die Datenbank kann durch folgende Pr
  1035. dikate ver
  1036. ndert werden:
  1037. assert (F_TERM, AUFRUFLISTE, INTEGER)
  1038.                PAR_1  wird als der Kopf einer Klausel,  PAR_2  als 
  1039.                deren  Rumpf betrachtet;  diese Klausel wird direkt 
  1040.                nach der n-ten Klausel der entsprechenden  Prozedur 
  1041.                in  die Datenbank eingef
  1042. gt ( n = PAR_3,  falls die 
  1043.                Klausel mit dieser Nummer existiert; n = Nummer der 
  1044.                letzten Klausel, falls PAR_3 > Anzahl der Klauseln; 
  1045.                falls  keine Klauseln existieren,  bzw.  PAR_3 < 1, 
  1046.                wird die neue Klausel als erste eingef
  1047. retract (NAME, INTEGER, INTEGER)
  1048.                PAR_2  darf  nicht negativ sein.  PAR_1  und  PAR_2 
  1049.                geben  Namen und Stelligkeit eines  Pr
  1050. dikates  an; 
  1051.                falls das entsprechende Pr
  1052. dikat keine Klausel  mit 
  1053.                der  Nummer PAR_3 besitzt,  schl
  1054. gt 'retract' fehl; 
  1055.                sonst  wird  die  entsprechende  Klausel  aus   der 
  1056.                Datenbank  entfernt,  und  'retract' wird  erf
  1057. llt. 
  1058.                Achtung  :  Falls  zum Zeitpunkt der L
  1059. schung  noch 
  1060.                Instanzen der gel
  1061. schten Klausel aktiv sind, werden 
  1062.                in  den  allermeisten F
  1063. llen  katastrophale  Fehler 
  1064.                auftreten !
  1065. clause (NAME, INTEGER, INTEGER, TERM, TERM)
  1066.                PAR_2  darf  nicht negativ sein.  PAR_1  und  PAR_2 
  1067.                geben  Namen und Stelligkeit eines  Pr
  1068. dikates  an; 
  1069.                falls das entsprechende Pr
  1070. dikat keine Klausel  mit 
  1071.                der  Nummer PAR_3 besitzt,  schl
  1072. gt 'clause'  fehl; 
  1073.                sonst wird versucht, PAR_4 mit deren Kopf und PAR_5 
  1074.                mit deren Rumpf zu unifizieren.
  1075. asserta (F_TERM)
  1076.                behandelt   PAR_1  als  eine  Klausel;   falls  der 
  1077.                
  1078. erste  Funktor  ':-' ist,  und das erste  seiner 
  1079.                Argumente  kein F_TERM ,  wird ein Fehler  erzeugt. 
  1080.                Die   Klausel   wird   als   erste   Klausel    des 
  1081.                entsprechenden   Pr
  1082. dikates   in   die    Datenbank 
  1083.                eingef
  1084. assertz (F_TERM)
  1085.                wie  'asserta',  aber  die Klausel wird als  letzte 
  1086.                Klausel   des  entsprechenden  Pr
  1087. dikates  in   die 
  1088.                Datenbank eingef
  1089. assert (F_TERM)
  1090.                ein Synonym f
  1091. r 'asserta'.
  1092. retract (F_TERM)
  1093.                behandelt  PAR_1  als  eine  Klausel;  falls  deren 
  1094.                
  1095. erster  Funktor  ':- ist,  und das erste  seiner 
  1096.                Argumente kein F_TERM,  so wird ein Fehler erzeugt. 
  1097.                Die erste Klausel,  die mit PAR_1 unifiziert werden 
  1098.                kann,  wird aus der Datenbank entfernt (falls PAR_1 
  1099.                die  Form  F_TERM  :-  VAR hat,  kann  es  nur  mit 
  1100.                Klauseln  unifiziert werden,  deren Rumpf aus einem 
  1101.                einzigen Variablenaufruf besteht !). Wenn 'retract' 
  1102.                wiedererf
  1103. llt  werden  soll,  wird die n
  1104. chste  mit 
  1105.                PAR_1 unifizierbare Klausel entfernt, usw.
  1106. clause (F_TERM, TERM)
  1107.                findet die erste Klausel,  deren Kopf mit PAR_1 und 
  1108.                deren Rumpf mit PAR_2 unifiziert werden kann.  Wird 
  1109.                nach   erfolgreicher  Unifikation   erf
  1110. llt;   soll 
  1111.                'clause' wiedererf
  1112. llt werden,  so wird die n
  1113. chste 
  1114.                Klausel gesucht, usw.
  1115. redefine 
  1116.                wird   f
  1117. r  die  Implementierung  von   'reconsult' 
  1118.                gebraucht (sollte nicht direkt aufgerufen  werden). 
  1119.                Zwischen zwei Aufrufen von 'redefine' verh
  1120. lt  sich 
  1121.                'assert' anders als normal :  wenn eine Klausel mit 
  1122.                'assert' gespeichert werden soll,  die nicht zu dem 
  1123.                zuletzt mit 'assert' gespeicherten Pr
  1124. dikat geh
  1125.                wird  vorher das gesamte Pr
  1126. dikat gel
  1127. scht,  zu dem 
  1128.                die neue Klausel geh
  1129. abolish (NAME, INTEGER)
  1130.                PAR_2  darf  nicht negativ sein;  das Pr
  1131. dikat  mit 
  1132.                Namen PAR_1 und Stelligkeit PAR_2 wird  vollst
  1133. ndig 
  1134.                gel
  1135. scht.
  1136. predefined (NAME, INTEGER)
  1137.                PAR_2   darf  nicht  neagtiv   sein;   'predefined' 
  1138.                
  1139. berpr
  1140. ft,  ob  das  Pr
  1141. dikat mit Namen  PAR_1  und 
  1142.                Stelligkeit PAR_2 eine Systemfunktion ist.
  1143. consult (DATEINAME)
  1144.                schaltet  den aktuellen Eingabestrom um  und  liest 
  1145.                Klauseln,  die  danach  mit  'assertz'  gespeichert 
  1146.                werden.  Es  gibt  dabei zwei Ausnahmen :  der Term 
  1147.                'end' beendet den Einlesemodus und stellt den alten 
  1148.                Eingabestrom  wieder her;  Terme mit  dem   Funktor 
  1149.                ':-'/1  werden als Kommandos betrachtet und  sofort 
  1150.                ausgef
  1151. reconsult (DATEINAME)
  1152.                wie 'consult',  aber vor und nach dem Einlesen wird 
  1153.                'redefine'  aufgerufen,   so  da
  1154.   zusammenh
  1155. ngende 
  1156.                Folgen  von  Klauseln  eines  Pr
  1157. dikates  das  alte 
  1158.                Pr
  1159. dikat ersetzen, statt es zu erg
  1160. nzen.
  1161. consultall (TERM)
  1162.                PAR_1 mu
  1163.  eine Liste von DATEINAMEn oder Termen der 
  1164.                Form '- DATEINAME' sein (auch gemischt);  f
  1165. r jeden 
  1166.                einfachen  DATEINAMEN  wird  'consult',  f
  1167. r  jeden 
  1168.                DATEINAMEN  mit '-'/1 wird 'reconsult'  aufgerufen. 
  1169.                Dieses Pr
  1170. dikat wird von der  Benutzerschnittstelle 
  1171.                aufgerufen, wenn eine Liste als Kommando eingegeben 
  1172.                wurde.
  1173. listing (F_TERM)
  1174.                PAR_1  mu
  1175.   ein  ATOM,   oder  ein  Term  der  Form 
  1176.                ATOM/INTEGER,  oder eine (eventuell verschachtelte) 
  1177.                Liste solcher Terme sein; jedes ATOM wird als Name, 
  1178.                jede   Zahl   als  Stelligkeit   eines   Pr
  1179. dikates 
  1180.                betrachtet.  Alle  Klauseln,  die zu dem jeweiligen 
  1181.                Pr
  1182. dikat   geh
  1183. ren,   werden   auf  den   aktuellen 
  1184.                Ausgabestrom ausgegeben.
  1185. listing 
  1186.                wie  listing/1,  aber  es  werden  alle  Pr
  1187. dikate, 
  1188.                einschlie
  1189. lich   der   vordefinierten    Pr
  1190. dikate, 
  1191.                ausgegeben.  Die Reihenfolge wird durch die 'hash'-
  1192.                Funktion des inneren Interpreters festgelegt
  1193.                und kann nicht ge
  1194. ndert werden.
  1195. proc (TERM)
  1196.                versucht,  PAR_1  mit einem F_TERM zu  unifizieren, 
  1197.                der  den  Namen  und  die  Stelligkeit  des  ersten 
  1198.                Pr
  1199. dikates  in der Datenbank besitzt;  soll  'proc' 
  1200.                wiedererf
  1201. llt  werden,  wird  das  jeweils  n
  1202. chste 
  1203.                Pr
  1204. dikat benutzt;  schl
  1205. gt fehl,  wenn kein solches 
  1206.                Pr
  1207. dikat mehr da ist. Zur Reihenfolge der Pr
  1208. dikate 
  1209.                siehe listing/0.
  1210.      III.2.9 Kontrolle des Programmablaufs
  1211. Bezeichnungen :
  1212.      Wenn  der Aufruf eines Pr
  1213. dikats eine Klausel aktiviert,  die 
  1214.      nicht  die letzte ihres Pr
  1215. dikats ist,  so wird dieser Kausel 
  1216.      ein  Zeiger in die Datenbank zugeordnet.  Dieser Zeiger  wird 
  1217.      verwendet,  wenn  das  aufgerufene Ziel wiedererf
  1218. llt  werden 
  1219.      mu
  1220.      Die direkten Nachkommen eines Aufrufes A sind die Aufrufe  in 
  1221.      der  durch A aktivierten Klausel.  Der direkte Vorfahr von  A 
  1222.      ist  der  Aufruf,  der  die  Klausel  aktivierte,  in  der  A 
  1223.      vorkommt.  Ein Vorfahr von A ist der direkte Vorfahr oder ein 
  1224.      Vorfahr  des  direkten Vorfahrs;  ein Nachkomme von A ist  ein 
  1225.      direkter Nachkomme oder einer von dessen Nachkommen.
  1226. !              ('cut', manchmal auch 'slash')
  1227.                wird erf
  1228. llt,  nachdem der n
  1229. chste Vorfahr gefunden 
  1230.                wurde,  der nicht call/1,  tag/1, ,/2 oder ;/2 ist. 
  1231.                Alle  Datenbankzeiger,  die zu diesem Vorfahren und 
  1232.                allen seinen Nachkommen geh
  1233. ren, werden entfernt.
  1234. repeat 
  1235.                wird  erf
  1236. llt,  und kann beliebig oft wiedererf
  1237.                werden.
  1238. call (AUFRUF)
  1239.                verh
  1240. lt sich so,  als ob PAR_1 anstelle des Aufrufs 
  1241.                von 'call' st
  1242. nde; allerdings wird ein fehlerhafter 
  1243.                Parameter  bei  Verwendung  von  'call'  erst   zur 
  1244.                Laufzeit   des   Programms  erkannt.   Im   
  1245. eren 
  1246.                Interpreter  kann  eine  Variable  anstelle   eines 
  1247.                Pr
  1248. dikates  als Aufruf in einer Klausel  vorkommen; 
  1249.                ein   solcher  Variablenaufruf  wird  vom   
  1250. eren 
  1251.                Interpreter in einen Aufruf von 'call' umgewandelt.
  1252. tag (AUFRUF)
  1253.                eine andere Form von call(AUFRUF); auf einen Aufruf 
  1254.                von  'tag'  kann  mit  den  Pr
  1255. dikaten   'tagfail', 
  1256.                'tagexit',   'tagcut'  und  'ancestor'  zugegriffen 
  1257.                werden.   PAR_1  hei
  1258. t  markierter  Vorfahr  seiner 
  1259.                Nachkommen.
  1260.                Ein  Aufruf von 'tag' wird von 'tagfail'  etc.  nur 
  1261.                dann  erkannt,  wenn  er explizit in einer  Klausel 
  1262.                steht; z.B. wird call(tag(A)) nicht erkannt.
  1263. ancestor (TERM)
  1264.                sucht  nach dem n
  1265. chsten markierten Vorfahren,  der 
  1266.                mit  PAR_1  unifiziert  werden  kann;  wird  keiner 
  1267.                gefunden,  so  schl
  1268. gt  'ancestor' fehl,  ansonsten 
  1269.                werden   der  Vorfahr  und  PAR_1  unifiziert   und 
  1270.                'ancestor' erf
  1271. tagcut (TERM)
  1272.                wie 'ancestor', aber bei Erfolg werden s
  1273. mtliche zu 
  1274.                dem  gefundenen  Vorfahren  und  seinen  Nachkommen 
  1275.                geh
  1276. renden Datenbankzeiger entfernt.
  1277. tagfail (TERM)
  1278.                sucht  nach dem n
  1279. chsten mit  PAR_1  unifizierbaren 
  1280.                markierten  Vorfahren;  schl
  1281. gt fehl,  falls keiner 
  1282.                gefunden   wird.   Wird   ein  markierter   Vorfahr 
  1283.                gefunden, so schl
  1284. gt dieser sofort fehl.
  1285. tagexit (TERM)
  1286.                sucht  nach dem n
  1287. chsten mit  PAR_1  unifizierbaren 
  1288.                markierten  Vorfahren;  schl
  1289. gt fehl,  falls keiner 
  1290.                gefunden   wird.   Wird   ein  markierter   Vorfahr 
  1291.                gefunden,  so  wird  er  mit PAR_1  unifiziert  und 
  1292.                sofort erf
  1293. llt (d.h.  der Aufruf nach tag(...) wird 
  1294.                als n
  1295. chstes betrachtet).
  1296. halt (ATOM)
  1297.                gibt ATOM aus und beendet den inneren Interpreter.
  1298. stop 
  1299.                beendet die Hauptschleife des 
  1300. eren Interpreters; 
  1301.                im  Normalfall wird 'halt' aufgerufen und auch  der 
  1302.                innere Interpreter beendet.  Ausnahmen sind m
  1303. glich 
  1304.                (z.B. im Editor).
  1305. sysload (DATEINAME)
  1306.                beendet  den 
  1307. eren Interpreter und  schaltet  den 
  1308.                aktuellen Eingabestrom auf die angegebene Datei um. 
  1309.                Diese  Datei sollte ein Programm in der Syntax  des 
  1310.                inneren  Interpreters  enthalten  (siehe   Anhang). 
  1311.                Nach   einem   'seen',   bzw.   bei  Erreichen  des 
  1312.                Dateiendes,  wird  der  
  1313. ere  Interpreter  wieder 
  1314.                gestartet.
  1315.      III.2.10 Hilfsmittel zum Testen von Programmen
  1316. In  der  ST-Version von TOY Prolog gibt es  die  M
  1317. glichkeit,  den 
  1318. Ablauf   eines  Programms  durch  Dr
  1319. cken  der  Tastenkombination
  1320.      'Shift' 'Alternate' 'Help'
  1321. zu unterbrechen. Das momentane Ziel wird in der Form
  1322.      INTR: .......
  1323. ausgegeben,   und   der  Benutzer  erh
  1324. lt  die  M
  1325. glichkeit,   den 
  1326. Programmablauf  zu  ver
  1327. ndern.  Dazu  kann  er  folgende  Optionen 
  1328. hlen:
  1329. A    (Abort)        Das   gesamte   zu   erf
  1330. llende   Ziel    wird 
  1331.                     abgebrochen   (einschlie
  1332. lich   des    
  1333. eren 
  1334.                     Interpreters).
  1335. B    (Backtrace)    Die  Vorfahren  des momentanen  Zieles  werden 
  1336.                     angezeigt.
  1337. C    (Continue)     Das momentane Ziel wird bearbeitet.
  1338. D    (Debug ON/OFF) Der  Testmodus  wird ein-  oder  ausgeschaltet 
  1339.                     (siehe 'debug').
  1340. F    (Fail)         Das momentane Ziel schl
  1341. gt fehl.
  1342. S    (Step ON/OFF)  Der   Einzelschrittmodus   wird   ein-    oder 
  1343.                     ausgeschaltet;  ist er eingeschaltet,  so wird 
  1344.                     das Programm vor der Bearbeitung des  n
  1345. chsten 
  1346.                     Zieles von selbst wieder unterbrochen.
  1347. Es  existieren  au
  1348. erdem einige Pr
  1349. dikate,  die  den  Programmtest 
  1350. erleichtern sollen:
  1351. interrupt 
  1352.                untebricht   den  Programmablauf  (als  h
  1353. tte   der 
  1354.                Benutzer die Taste 'Help' gedr
  1355. ckt).
  1356. debug 
  1357.                schaltet den Testmodus ein. Im Testmodus wird jedes 
  1358.                zu   bearbeitende   Ziel  mit   einer   Information 
  1359.                ausgegeben, die anzeigt, ob das Ziel
  1360.                - das erste Mal aufgerufen wird     (CALL: ...)
  1361.                - wiedererf
  1362. llt werden soll         (REDO: ...)
  1363.                - erfolgreich beendet wird          (EXIT: ...)
  1364.                - oder fehlschl
  1365. gt                  (FAIL: ...).
  1366. nodebug 
  1367.                schaltet den Testmodus aus.
  1368. nonexistent 
  1369.                schaltet   die   
  1370. berwachung   der   Aufrufe    von 
  1371.                undefinierten  Pr
  1372. dikaten ein.  Nach  'nonexistent' 
  1373.                wird  beim  Aufruf eines  undefinierten  Pr
  1374. dikates 
  1375.                eine Meldung ausgegeben.
  1376. nononexistent 
  1377.                schaltet diese Meldungen wieder aus.
  1378. Die folgenden beiden Pr
  1379. dikate schalten den Testmodus selektiv f
  1380. bestimmte Aufrufe ein:
  1381. spy (NAME, INTEGER)
  1382.                PAR_2  darf nicht negativ sein;  der Testmodus wird 
  1383.                f
  1384. r  das  Pr
  1385. dikat  mit dem  Namen  PAR_1  und  der 
  1386.                Stelligkeit PAR_2 eingeschaltet.
  1387. spy (NAME, VAR)
  1388.                dito, aber f
  1389. r alle Pr
  1390. dikate mit diesem Namen; die 
  1391.                Variable wird nicht instantiiert.
  1392. spy (VAR, INTEGER)
  1393.                dito,   aber   f
  1394. r  alle  Pr
  1395. dikate  mit  gegebener 
  1396.                Stelligkeit.
  1397. spy (VAR, VAR)
  1398.                dito,  aber f
  1399. r alle Pr
  1400. dikate.  Der Effekt ist der 
  1401.                gleiche  wie  bei  'debug',  kann  aber  nicht  mit 
  1402.                'nodebug'  wieder abgeschaltet werden (!).  Da  die 
  1403.                Variablen  nicht  instantiiert  werden,   kann  man 
  1404.                zweimal dieselbe Variable verwenden.
  1405. nospy (PAR1, PAR2)
  1406.                schaltet  den  Testmodus selektiv wieder  ab.  Alle 
  1407.                Aufrufmuster von 'spy' k
  1408. nnen in der gleichen Weise 
  1409.                wie  dort  verwendet werden.  'nospy' kann den  mit 
  1410.                'debug' eingeschalteten allgemeinen Testmodus nicht 
  1411.                ausschalten.
  1412. spied (NAME, INTEGER)
  1413.                
  1414. berpr
  1415. ft,  ob  der  selektive  Testmodus  f
  1416. r  das 
  1417.                Pr
  1418. dikat  mit  Namen PAR_1  und  Stelligkeit  PAR_2 
  1419.                eingeschaltet ist.
  1420.      III.2.11 Verarbeitung von grammatikalischen Regeln
  1421. phrase (AUFRUF, TERM)
  1422.                behandelt  PAR_1 als nicht-terminales Symbol  einer 
  1423.                grammatikalischen    Regel   und   veranla
  1424. t    die 
  1425.                Verarbeitung von PAR_2, wobei PAR_1 als Startsymbol 
  1426.                verwendet wird.
  1427.      III.2.12 Verschiedene Funktionen
  1428. length (F_TERM, TERM)
  1429.                PAR_1  mu
  1430.   eine 'geschlossene' Liste  sein,  deren 
  1431.                L
  1432. nge  berechnet  wird.   Es  wird  versucht,   das 
  1433.                Ergebnis mit PAR_2 zu unifizieren.
  1434. isclosedlist (TERM)
  1435.                
  1436. berpr
  1437. ft, ob PAR_1 eine 'geschlossene' Liste ist.
  1438. numbervars (TERM)
  1439.                instantiiert die Variablen, die in PAR_1 vorkommen, 
  1440.                mit 'V'(1), 'V'(2), ... . Variablen, die aneinander 
  1441.                gebunden   sind,   werden  mit  dem  selben  'V'(n) 
  1442.                instantiiert.
  1443. member (TERM, TERM)
  1444.                
  1445. berpr
  1446. ft,  ob  PAR_1  ein Element der Liste  PAR_2 
  1447.                ist. Falls PAR_2 eine 'offene' Liste ist, die PAR_1 
  1448.                nicht  enth
  1449. lt,  so wird 'member' erf
  1450. llt,  nachdem 
  1451.                die Liste um PAR_1 erweitert wurde.
  1452. bagof (TERM, AUFRUF, TERM)
  1453.                versucht,  PAR_3  mit  einer Liste der f
  1454. r PAR_1  - 
  1455.                nach  allen  m
  1456. glichen  Berechnungen  von  PAR_2  - 
  1457.                ermittelten Instantiierungen zu unifizieren.
  1458. status 
  1459.                gibt    eine   
  1460. bersicht   
  1461. ber    die    momentane 
  1462.                Speicherbelegung.
  1463. Die folgenden Pr
  1464. dikate benutzen die Uhr des ATARI ST:
  1465. date (VARINT, VARINT, VARINT)
  1466.                versucht,  PAR_1,  PAR_2  und  PAR_3 mit Zahlen  zu 
  1467.                unifizieren, die das Datum in der Form "Tag, Monat, 
  1468.                Jahr" angeben.
  1469. set_date (INTEGER, INTEGER, INTEGER)
  1470.                setzt das Datum fest :  Par_1 - Tag, PAR_2 - Monat, 
  1471.                PAR_3 - Jahr.
  1472. time (VARINT, VARINT, VARINT)
  1473.                versucht,  PAR_1,  PAR_2  und  PAR_3 mit Zahlen  zu 
  1474.                unifizieren, die die Tageszeit in der Form "Stunde, 
  1475.                Minute, Sekunde" angeben.
  1476. set_time (INTEGER, INTEGER, INTEGER)
  1477.                stellt die Uhr (PAR_1 Stunde,  PAR_2 Minute,  PAR_3 
  1478.                Sekunde).
  1479. 'time' und 'set_time' arbeiten mit Einheiten von 2 Sekunden.
  1480. translate (DATEINAME, DATEINAME)
  1481.                schaltet die Eingabe auf PAR_1 und die Ausgabe  auf 
  1482.                PAR_2  um  und  
  1483. bersetzt das  von  PAR_1  gelesene 
  1484.                Programm  in die Syntax des  inneren  Interpreters. 
  1485.                Das  Ergebnis  ist eine Datei,  die  mit  'sysload' 
  1486.                eingelesen werden kann.
  1487.                Siehe   auch   die   Abschnitte   
  1488. ber   'consult', 
  1489.                'sysload', sowie den Anhang.
  1490.      III.3 Die GEM-Funktionen
  1491. TOY  Prolog  ST  kann auf einige der Funktionen von  VDI  und  AES 
  1492. zugreifen.   Genaueres   zu  diesen  Funktionen  kann  hier  nicht 
  1493. angegeben werden.
  1494. In  den folgenden Kurzbeschreibungen sind alle  Parameter,  soweit 
  1495. nicht anders angegeben, INTEGER-Zahlen.
  1496.      III.3.1 Kontrollfunktionen
  1497. grf_clip (Flag, X1, Y1, X2, Y2)
  1498.                Falls  Flag = 0,  wird das Clipping  ausgeschaltet, 
  1499.                sonst  eingeschaltet;  (X1,  Y1)  und (X2,  Y2) sind 
  1500.                diagonal  gegen
  1501. berliegende  Ecken  des   Clipping-
  1502.                Rechtecks.
  1503. grf_wrmode (Modus)
  1504.                Stellt den Schreibmodus ein :
  1505.                0 - Replace - Modus
  1506.                1 - Transparent-Modus
  1507.                2 - XOR - Modus
  1508.                3 - Reverse-Transparent-Modus
  1509. grf_colour (Index, Rot, Gr
  1510. n Blau)
  1511.                Setzt die Farbzusammensetzung f
  1512. r die Farbe mit der 
  1513.                Nummer  Index  fest.  Rot,  Gr
  1514. n und Blau liegen im 
  1515.                Bereich 1 - 1000.
  1516. grf_mode 
  1517.                Schaltet den Grafikmodus ein.
  1518. txt_mode 
  1519.                Schaltet den Textmodus ein.
  1520.      III.3.2 Graphische Ausgabe
  1521. grf_pline (Koordinatenliste)
  1522.                PAR_1  mu
  1523.  eine Liste mit einer geraden Anzahl  von 
  1524.                INTEGERs  sein.  Je zwei der Listenelemente  werden 
  1525.                als Koordinaten betrachtet;  es wird ein Polygonzug 
  1526.                (Polyline) gezeichnet.
  1527. grf_pmarker (Koordinatenliste)
  1528.                Es wird eine Anzahl von Markierungen mit den  durch 
  1529.                PAR_1 angegebenen Koordinaten gezeichnet.
  1530. grf_poly (Koordinatenliste)
  1531.                Es wird ein ausgef
  1532. lltes Polygon gezeichnet.
  1533. grf_fill (X, Y, Index)
  1534.                Eine  Fl
  1535. che  wird bis zu  ihrem  Rand  ausgef
  1536. llt, 
  1537.                ausgehend   vom  Punkt  (X,   Y).   Index  ist  der 
  1538.                urspr
  1539. ngliche Farbindex der Fl
  1540. grf_box (X1, Y1, X2, Y2)
  1541.                Es  wird  ein  ausgef
  1542. lltes   Rechteck  gezeichnet; 
  1543.                (X1, Y1) und (X2, Y2) sind gegen
  1544. berliegende Ecken.
  1545. grf_bar (X1, Y1, X2, Y2)
  1546.                dito, aber das Rechteck wird umrandet.
  1547. grf_arc (X, Y, R, Alpha, Omega)
  1548.                Ein  Kreisbogen mit Mittelpunkt (X,  Y),  Radius R, 
  1549.                Startwinkel   Alpha   und  Endwinkel   Omega   wird 
  1550.                gezeichnet.
  1551. grf_pie (X, Y, R, Alpha, Omega)
  1552.                dito, aber ausgef
  1553. llter Kreissektor.
  1554. grf_circle (X, Y, R)
  1555.                Ein  ausgef
  1556. llter Kreis mit Mittelpunkt (X,  Y) und 
  1557.                Radius R wird gezeichnet.
  1558. grf_ellipse (X, Y, Xrad, Yrad)
  1559.                Eine ausgef
  1560. llte Ellipse mit Mittelpunkt (X, Y) und 
  1561.                Achsenabschnitten Xrad und Yrad wird gezeichnet.
  1562. grf_rbox (X1, Y1, X2, Y2)
  1563.                Zeichnet   ein  nicht  ausgef
  1564. lltes  Rechteck   mit 
  1565.                abgerundeten Ecken.
  1566. grf_rfbox (X1, Y1, X2, Y2)
  1567.                Wie 'grf_rbox', aber ausgef
  1568. lltes Rechteck.
  1569. grf_text (X, Y, Text)
  1570.                Text ist ein NAME,  der an der Position (X,  Y) als 
  1571.                Grafiktext ausgegeben wird.
  1572.      III.3.3 Attribute-Funktionen
  1573. grf_l_colour (Index)
  1574.                Setzt die Linienfarbe fest.
  1575. grf_l_type (Style)
  1576.                Setzt den Linientyp fest :
  1577.                1 : durchgezogen
  1578.                2 - 6 : gestrichelt
  1579.                7 : frei definierbar
  1580. grf_l_udstyle (Pattern)
  1581.                Setzt   den  frei  definierbaren  Linientyp   fest. 
  1582.                Pattern  ist eine INTEGER-Zahl,  deren 16 Bits  das 
  1583.                Muster festlegen.
  1584. grf_l_width (Width)
  1585.                Setzt die Linienbreite fest.
  1586. grf_l_ends (Begin, End)
  1587.                Setzt das Aussehen  von  Linienanfang  (Begin)  und 
  1588.                -ende (End) fest.
  1589.                0 : kantig
  1590.                1 : Pfeil
  1591.                2 : abgerundet
  1592. grf_m_colour (Index)
  1593.                Setzt die Farbe der Markierungen fest.
  1594. grf_m_type (Type)
  1595.                Setzt den Markierungstyp fest.
  1596.                1 : Punkt
  1597.                2 : Kreuz
  1598.                3 : Stern
  1599.                4 : Quadrat
  1600.                5 : Diagonalkreuz
  1601.                6 : Raute
  1602. grf_m_height (Height)
  1603.                Setzt die Markierungsgr
  1604. e fest.
  1605. grf_t_height (Height)
  1606.                Setzt die Textgr
  1607. e fest.
  1608. grf_t_point (Point)
  1609.                Setzt die Textgr
  1610. e in Punkt fest.
  1611. grf_t_rotation (Angle)
  1612.                Setzt  den Winkel fest,  um den die  Textgrundlinie 
  1613.                gedreht wird.
  1614. grf_t_colour (Index)
  1615.                Setzt die Textfarbe fest.
  1616. grf_t_effects (Effects)
  1617.                Setzt  die Texteffekte fest.  Effects entsteht  als 
  1618.                Summe der gew
  1619. nschten Effekte :
  1620.                1 : Fettdruck
  1621.                2 : Helle Schrift
  1622.                4 : Kursivschrift 
  1623.                8 : Unterstreichung
  1624.                16 : Au
  1625. enrand der Buchstaben
  1626. grf_t_align (Hor, Vert)
  1627.                Setzt die Textausrichtung fest.
  1628.                Hor : horizontale Ausrichtung -
  1629.                     0 : links
  1630.                     1 : zentriert
  1631.                     2 : rechts
  1632.                Vert : vertikale Ausrichtung -
  1633.                     0 : Grundlinie
  1634.                     1 : Obergrenze Kleinbuchstaben
  1635.                     2 : Obergrenze Zeichen
  1636.                     3 : Untergrenze Zeichenbox
  1637.                     4 : Untergrenze Unterl
  1638.                     5 : Obergrenze Zeichenbox
  1639. grf_f_colour (Index)
  1640.                Setzt die F
  1641. llfarbe fest.
  1642. grf_f_type (Interior)
  1643.                Setzt den F
  1644. lltyp fest :
  1645.                0 : leer
  1646.                1 : voll
  1647.                2 : gemustert
  1648.                3 : schraffiert
  1649.                4 : frei definierbar
  1650. grf_f_style (Style)
  1651.                Setzt f
  1652. r die F
  1653. lltypen 2 und 3 den F
  1654. llstil fest.
  1655. grf_f_perim (Flag)
  1656.                Schaltet die Umrandung von ausgef
  1657. llten Fl
  1658. chen  an 
  1659.                (Flag = 1) oder aus (Flag = 0).
  1660. grf_f_udpat (Pattern)
  1661.                Pattern mu
  1662.  eine Liste mit genau 16  INTEGER-Zahlen 
  1663.                sein.  Die  16  Zahlen  werden als Muster  f
  1664. r  den 
  1665.                F
  1666. lltyp 4 verwendet.
  1667.      III.3.4 Funktionen zur Maussteuerung
  1668. grf_mse_hide 
  1669.                Schaltet die Maus (den Grafikcursor) aus.
  1670. grf_mse_show (Flag)
  1671.                Ist  Flag  =  0,  so wird die  Maus  sofort  wieder 
  1672.                eingeschaltet;  ansonsten wird sie erst dann wieder 
  1673.                eingeschaltet,   wenn  'grf_mse_show'  genauso  oft 
  1674.                aufgerufen wurde wie vorher 'grf_mse_hide'.
  1675. grf_mse_form (Form)
  1676.                Schaltet eine vordefinierte Mausform ein.
  1677.                0 : Pfeil
  1678.                1 : 'Cursor'
  1679.                2 : Biene
  1680.                3 : zeigende Hand
  1681.                4 : flache Hand
  1682.                5 : d
  1683. nnes Kreuz
  1684.                6 : dickes Kreuz
  1685.                7 : Umri
  1686. kreuz
  1687.                255 : Bleistift
  1688. grf_mse_form (Xhot, Yhot, Mask, Data, Pattern)
  1689.                Schaltet eine frei definierte Mausform ein :
  1690.                Xhot   und   Yhot   sind   die   Koordinaten    des 
  1691.                Aktionspunktes  innerhalb des  16x16-Rasters,  Mask 
  1692.                und  Data sind die Hinter-  bzw.  Vordergrundfarbe. 
  1693.                Pattern  mu
  1694.   eine  aus  genau  32   INTEGER-Zahlen 
  1695.                bestehende  Liste sein;  die ersten 16 davon  geben 
  1696.                die Maske,  die letzten 16 die Daten f
  1697. r das Raster 
  1698.                an.
  1699. grf_mse_state (Button, X, Y)
  1700.                Die Parameter m
  1701. ssen Variablen oder  INTEGER-Zahlen 
  1702.                sein;  es wird versucht,  Button mit dem momentanen 
  1703.                Zustand  der  Maustasten  und  X  bzw.  Y  mit  der 
  1704.                momentanen    Position   des    Grafikcursors    zu 
  1705.                unifizieren.
  1706.      III.3.5 Darstellen einer Warnmeldung
  1707. alert (Defbutton, Alert, Exbutton)
  1708.                Alert  mu
  1709.   ein NAME sein;  die Zeichen des  Namens 
  1710.                werden als Zeichenkette betrachtet.
  1711.                Die  AES-Funktion 'form_alert' wird aufgerufen;  es 
  1712.                wird versucht, den Wert, den sie zur
  1713. ckliefert, mit 
  1714.                Exbutton zu unifizieren.
  1715.                Exbutton  mu
  1716.  eine Integer-Zahl oder eine  Variable 
  1717.                sein.
  1718.      III.4 Namen der Systemfunktionen
  1719. Die  Namen der Systemfunktionen k
  1720. nnen ge
  1721. ndert werden,  indem man 
  1722. die  Beschreibungen  im zweiten Abschnitt der  Systemdatei  
  1723. ndert 
  1724. (siehe  Anhang).  Dabei  ist  darauf  zu  achten,  da
  1725.   weder  die 
  1726. Reihenfolge  noch die Anzahl der Namen ge
  1727. ndert wird,  und da
  1728.  die 
  1729. Stelligkeiten erhalten bleiben.
  1730. Es  empfiehlt  sich,  vor  einer 
  1731. nderung eine  neue  Version  der 
  1732. Benutzerschnittstelle  herzustellen,  da  nach einer 
  1733. nderung  die 
  1734. vorherige  Version  wahrscheinlich nicht mehr lauff
  1735. hig  ist.  Das 
  1736. Gleiche gilt f
  1737. r alle anderen Programme.
  1738. Die Namen der vordefinierten Pr
  1739. dikate k
  1740. nnen nur ge
  1741. ndert werden, 
  1742. indem deren Definition in der Systemdatei,  bzw.  (bei Pr
  1743. dikaten, 
  1744. die  zur  Benutzerschnittstelle  geh
  1745. ren)  im  Quelltext  ge
  1746. ndert 
  1747. werden. Auch hierf
  1748. r gelten die obigen Hinweise.
  1749.      IV. Die Hilfsprogramme von TOY Prolog
  1750.      IV.1 Der 
  1751. bersetzer f
  1752. r die Benutzerschnittstelle
  1753. Quellcode und Zwischencode : 'BOOTER.TOY'.
  1754. Das  Programm 'BOOTER.TOY' wird ben
  1755. tigt,  um nach 
  1756. nderungen  der 
  1757. Benutzerschnittstelle   eine   neue   Version   der    Systemdatei 
  1758. herzustellen. Die Benutzerschnittstelle ist nicht im vollst
  1759. ndigen 
  1760. Prolog geschrieben,  sondern in einer 'abgemagerten' Version,  die 
  1761. sich  leicht  in die Syntax des  inneren  Interpreters  
  1762. bersetzen 
  1763. t. Der 
  1764. bersetzer erledigt genau diese Arbeit.
  1765. Benutzung des 
  1766. bersetzers
  1767. Um eine neue Version der Benutzerschnittstelle zu 
  1768. bersetzen, wird 
  1769. bersetzer mit 'sysload' geladen.
  1770. Der Aufruf erfolgt in der Form
  1771.      transl(Eingabedatei, Ausgabedatei).
  1772. also analog zum vordefinierten Pr
  1773. dikat 'translate'.
  1774. Als Zeichen f
  1775. r das Ende der Eingabedatei dient das Zeichen '#';
  1776. falls  es  nicht am Ende der Eingabedatei steht,  mu
  1777.  es von  Hand 
  1778. eingegeben werden.
  1779. Der  
  1780. bersetzer  kann Fehlermeldungen produzieren;  dabei gibt  er 
  1781. den  Namen desjenigen Pr
  1782. dikats aus,  das den Fehler entdeckt hat, 
  1783. sowie  das  fehlerhafte Zeichen und den Rest der Eingabe  bis  zum 
  1784. chsten Punkt.
  1785. Ist   die  
  1786. bersetzung  fehlerfrei  verlaufen,   so  enth
  1787. lt   die 
  1788. Ausgabedatei    den   Zwischencode   der   neuen    Version    der 
  1789. Benutzerschnittstelle; dieser Code kann - am besten nach Entfernen 
  1790. der   Kommentare  -  mit  einem  Texteditor  anstelle  des   alten 
  1791. Zwischencodes in die Systemdatei eingef
  1792. gt werden.  Es ist ratsam, 
  1793. vorher eine Kopie der alten (lauff
  1794. higen !)  Benutzerschnittstelle 
  1795. zu  machen,  da es durchaus vorkommen kann,  da
  1796.  die neue  Version 
  1797. fehlerhaft ist. Beliebte Fehler sind das Verwechseln von Gro
  1798. - und 
  1799. Kleinschreibung, insbesondere bei Variablennamen wie z.B.
  1800.      NextCh  -  Nextch  -  NextChar - NextChr  etc.
  1801.      IV.2 Der Editor
  1802. Quelltext : 'EDITOR'.
  1803. Zwischencode : 'EDITOR.TOY'.
  1804. Es handelt sich um einen einfachen Editor f
  1805. dikate.
  1806. Er wird mit
  1807.      edit (Name/Stelligkeit).
  1808. aufgerufen.   Der  Editor  zeigt  jeweils  die  momentane  Klausel 
  1809. zusammen  mit ihrer Nummer an;  am Anfang steht er auf Klausel  0, 
  1810. d.h.  vor der ersten Klausel.  Nach jedem Kommando wird die (neue) 
  1811. Klausel angezeigt.
  1812. Der Editor versteht folgende Kommandos :
  1813. e Name/Stelligkeit  ruft eine neue Inkarnation des Editors auf. Es 
  1814.                     kann ein anderes Pr
  1815. dikat bearbeitet werden.
  1816. x                   verl
  1817. t die momentane Inkarnation des Editors.
  1818. +                   zeigt  die n
  1819. chste Klausel an,  falls es  eine 
  1820.                     gibt.
  1821. <CR>                (Leerzeile) wie +
  1822. -                   zeigt die vorherige Klausel an (falls es  eine 
  1823.                     gibt).
  1824. t                   geht zur Klausel 0.
  1825. b                   geht zur letzten Klausel.
  1826. l                   listet das gesamte Pr
  1827. dikat auf.
  1828. d                   l
  1829. scht  die  momentane Klausel  und  geht  zur 
  1830.                     n
  1831. chsten (oder zur letzten,  falls die  vorher 
  1832.                     letzte gel
  1833. scht wurde).
  1834. i                   In  den folgenden Zeilen eingegebene  Klauseln 
  1835.                     werden nach der momentanen Klausel  eingef
  1836.                     'end.' beendet den Einf
  1837. gemodus.
  1838. f Dateiname         Wie  'i',  aber  die Klauseln werden  aus  der 
  1839.                     angegebenen Datei gelesen.
  1840. p                   ruft eine neue Inkarnation von Prolog auf (!). 
  1841.                     Wenn  'stop' ausgef
  1842. hrt wird,  wird im  Editor 
  1843.                     fortgefahren.     In    der    verschachtelten 
  1844.                     Inkarnation von Prolog sollte 'sysload'  nicht 
  1845.                     benutzt werden.
  1846. Ein  eingegebenes  Kommando mu
  1847.  nach dem letzten  Zeichen  beendet 
  1848. werden.  Wo Leerzeichen angegeben sind, mu
  1849.  genau eines eingegeben 
  1850. werden.
  1851.      IV.3 Der Programmanalysator
  1852. Quelltext : 'CALLTREE'
  1853. Zwischencode : 'CALLTREE.TOY'
  1854. Der Programmstrukturanalysator wird mit
  1855.      calltree (Name/Stelligkeit).
  1856. aufgerufen,  um  das  Pr
  1857. dikat mit dem angegebenen Namen  und  der 
  1858. angegebenen Stelligkeit zu analysieren.  Er erzeugt eine Liste der 
  1859. Aufrufe,  die w
  1860. hrend des Programmablaufs als Teilziele betrachtet 
  1861. werden.
  1862. Teilziele werden in der Zeile,  in der sie erstmals vorkommen, mit 
  1863. einer Nummer versehen, auf die bei nochmaligem Auftreten verwiesen 
  1864. wird.
  1865. Die Verschachtelungstiefe wird durch verschieden weite  Einr
  1866. ckung 
  1867. der Zeilen angezeigt.
  1868. Der    Programmstrukturanalysator   sollte   nicht   mit    'Help' 
  1869. unterbrochen werden und nicht im Testmodus laufen,  da w
  1870. hrend des 
  1871. Programmablaufs  in den meisten F
  1872. llen  zyklische  Datenstrukturen 
  1873. erzeugt werden.  Solche Datenstrukturen entstehen z.B.  auch, wenn 
  1874. die Terme
  1875.      X              und            f(X)
  1876. unifiziert werden. Wie man sieht, enth
  1877. lt TOY Prolog keinen 'occur 
  1878. check' : Die Terme werden ohne weiteres unifiziert. Jeder Versuch, 
  1879. den enstehenden Term auszugeben,  f
  1880. hrt allerdings in eine endlose 
  1881. Ausgabeschleife,  die  zum  Absturz  des  Interpreters  f
  1882. hrt.  Im 
  1883. Programmanalysator   werden   solche  Strukturen   erzeugt,   wenn 
  1884. rekursive Pr
  1885. dikate analysiert werden.
  1886.      V. Die Demonstrationsprogramme
  1887.      V.1 ALPHA
  1888. Quellcode : 'ALPHA'
  1889. ALPHA  ist  ein  Beispiel f
  1890. r  die  Entwicklung  von  interaktiven 
  1891. Programmen. Nach dem Einlesen wird es mit 'go.' aufgerufen.
  1892. ALPHA   versteht   drei  Formen  von   S
  1893. tzen.   Nachstehend   ein 
  1894. beispielhafter Dialog (Ausgaben unterstrichen) :
  1895. (...)
  1896. John is a man.
  1897. A man is a person.
  1898. Is John a person ?
  1899. Is Mary a person ?
  1900. I don't know !
  1901. (...)
  1902. ALPHA liest die S
  1903. tze mit einem Pr
  1904. dikat ein, das einzelne Zeichen 
  1905. liest und sie zu Worten zusammenfa
  1906. t.  Die dabei entstehende Liste 
  1907. von  Worten  wird  danach  mit  Hilfe  von  grammatischen   Regeln 
  1908. untersucht   und  in  Prolog-Anweisungen  
  1909. bersetzt.   Die  obigen 
  1910. Eingaben f
  1911. hren z.B.  dazu, da
  1912.  folgende Klauseln in die Datenbank 
  1913. bernommen werden :
  1914. man(john).
  1915. person(X) :- man(X).
  1916.      V.2 TOYSEQUEL (
  1917.  1983 Kluzniak & Szpakowicz)
  1918. Quelltext : 'TOYSEQ'
  1919. TOYSEQUEL  ist ein erheblich gr
  1920. eres Beispiel f
  1921. r  die  Benutzung 
  1922. von    grammatikalischen   Regeln   zur   Implementierung    einer 
  1923. Kommandosprache.  TOYSEQUEL stellt eine relationale Datenbank dar. 
  1924. Eine genaue Beschreibung der Kommandos findet sich in "Prolog  for 
  1925. Programmers".
  1926. Hier  kann  nur auf die Grundlagen eingegangen  werden,  und  zwar 
  1927. anhand von Beispielen :
  1928. Aufruf von TOYSEQUEL
  1929. :- toysequel.
  1930. Es werden einige Relationen erzeugt
  1931. create ANG < string name, integer gehalt, integer abtnr >.
  1932. create ABT < integer abtnr, string manager >.
  1933. create Aufsichtsrat < string name, integer funktion >.
  1934. gen von Datentupeln
  1935. into ANG insert <"Schmidt", 1000, 1>, <"Meier", 1200, 2>,
  1936.                 <"M
  1937. ller", 600, 1>.
  1938. into ABT insert <1, "Raffke">, <2, "Hoffmann">.
  1939. Anfragen 
  1940. ber Relationen
  1941. relations.
  1942. Aufsichtsrat 
  1943. relation ANG.
  1944. string name 
  1945. integer gehalt 
  1946. integer abtnr 
  1947. Betrachten von Tupeln mit bestimmten Eigenschaften
  1948. select from ANG tuples <name, gehalt> where abtnr = 1.
  1949. Schmidt 1000 
  1950. ller 600 
  1951. gen von ausgew
  1952. hlten Tupeln
  1953. into ANG insert select from ABT tuples <manager, 1000, abtnr>.
  1954. ndern von Tupeln
  1955. update ANG so that gehalt = 1200 where name = "Raffke".
  1956. from ANG delete tuples where name = "Hoffmann".
  1957. Die  M
  1958. glichkeiten des Programms gehen noch erheblich  weiter;  es 
  1959. gibt   verschiedene   M
  1960. glichkeiten   des   Vergleichs,   beliebig 
  1961. komplizierte  arithmetische Ausdr
  1962. cke;  kommt ein Name in mehreren 
  1963. Relationen vor,  so kann er durch Qualifizieren eindeutig bestimmt 
  1964. werden;  eine  Relation,  die in einem Kommando mehrfach gebraucht 
  1965. wird, kann 'Alias'-Namen erhalten etc.
  1966. Noch drei wichtige Kommandos :
  1967. dump to DATEINAME.
  1968. speichert die Relationen in der angegebenen Datei.
  1969. load from DATEINAME.
  1970. dt eine Datei.
  1971. stop.
  1972. kehrt zur
  1973. ck zu TOY Prolog.
  1974.      V.3 Tic Tac Toe
  1975. Quelltext : 'TICTAC.TOE'
  1976. Zwischencode : 'TICTAC.TOY'
  1977. Tic  Tac  Toe  soll die Verwendung der  Grafikfunktionen  von  TOY 
  1978. Prolog ST anhand eines Bei - Spiels demonstrieren.
  1979. Der Aufruf erfolgt durch
  1980. tictactoe.
  1981. Der  Benutzer  spielt gegen den Computer (das Programm  ist  etwas 
  1982. langweilig, da der Computer nicht verlieren kann).
  1983. Ein Zug wird ausgef
  1984. hrt, indem der Benutzer mit dem Mauszeiger auf 
  1985. ein  freies Feld des Spielbrettes zeigt und den  linken  Mausknopf 
  1986. Wird  der Mausknopf gedr
  1987. ckt,  w
  1988. hrend der Zeiger auf den  'STOP'-
  1989. Knopf zeigt, so wird das Programm beendet.
  1990. Ende der allgemeinen Dokumemtation zu TOY Prolog ST, Version 3.
  1991.